package config

import (
	"embed"
	"encoding/json"
	"os"
)

//go:embed default.json
var configDefault embed.FS

// 因mysql连接中无时间格式化配置项，且此处使用的字符串配置，所以直接采用string类型时间进行默认存储
const (
	DATETIME_MIN = "1970-01-01 08:00:00" // 最小日期时间/空日期时间/unix0时间戳
	DATETIME_MAX = "2099-12-31 23:59:59" // 最大日期时间
	DATE_MIN     = "1970-01-01"          // 最小日期/空日期
	DATE_MAX     = "2099-12-31"          // 最大日期
	TIME_MIN     = "00:00:01"            // 最小时间/空时间
	TIME_MAX     = "23:59:59"            // 最大时间
)

// 配置项的结构体信息
type Config struct {
	RunAddr string `json:"run_addr"` // 运行端口监听
	MySQL   string `json:"mysql"`    // 连接MySQL数据库
}

// 加载配置文件列表
var fileList []string = []string{
	"/etc/gatway/config.json",
	"/etc/gatway/.env.json",
	"config.json",
	".env.json",
	"/home/xiaoyutab/go/src/gitee.com/xiaoyutab/gatway/.config.json",
	"/home/xiaoyutab/go/src/gitee.com/xiaoyutab/gatway/.env.json",
}

var config *Config

// 获取配置对象
func GetConfig() *Config {
	if config != nil {
		return config
	}
	config = &Config{}
	// 读取默认配置
	cont, err := configDefault.ReadFile("default.json")
	if err != nil {
		panic("默认配置文件加载失败")
	}
	err = json.Unmarshal(cont, config)
	if err != nil {
		panic("默认配置文件读取失败")
	}
	// 加载指定位置内的配置信息
	// 进行JSON配置读取、赋值
	for _, v := range fileList {
		if _, err := os.Stat(v); err == nil {
			conf := &Config{}
			// 如果文件存在
			fp, err := os.OpenFile(v, os.O_RDONLY, 0755)
			if err != nil {
				panic("配置文件读取错误：" + err.Error())
			}
			defer fp.Close()
			data := make([]byte, 1<<16) // 读取配置文件，限制配置文件大小为64KB
			n, err := fp.Read(data)
			if err != nil {
				panic("配置文件读取错误：" + err.Error())
			}
			err = json.Unmarshal(data[:n], conf) // 格式化JSON
			if err != nil {
				panic("JSON文件格式错误【" + v + "】：" + err.Error())
			}
			// 使用配置项进行覆盖Config
			if conf.MySQL != "" {
				config.MySQL = conf.MySQL
			}
			if conf.RunAddr != "" {
				config.RunAddr = conf.RunAddr
			}
		}
	}
	return config
}
